package modelo;

import java.io.Serializable;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.criterion.Restrictions;

import dao.imp.Base_DatosDAO;

public class Cuenta{
	private String id;
	private Cliente cliente;
	private Date fecha;
	
	public Cuenta() {
		super();
	}

	public Cuenta(String id,Cliente cliente, Date fecha) {
		super();
		this.id=id;
		this.cliente = cliente;
		this.fecha = fecha;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}
	
	public boolean Cuenta_Cerrada() throws ParseException {
		return (Calcular_Saldo()==0);
	}
	public double Calcular_Saldo() throws ParseException{
		return Math.rint((Calcular_Monto_Compras()-Calcular_Monto_Pagos()-Calcular_Monto_Ventas())*100)/100; 
	}
	public double Calcular_Monto_Pagos(){
		List<Pago> pagos = this.getPagos();
		double total=0;
		for (int i=0;i<pagos.size();i++){
			total += pagos.get(i).getMonto();
		}
		return total;
	}
	public double Calcular_Monto_Ventas() throws ParseException{
		List<Venta> ventas = this.getVentas();
		double total=0;
		for (int i=0;i<ventas.size();i++){
			total += ventas.get(i).MontoTotal_Venta();
		}
		return total;
	}
	public double Calcular_Monto_Compras() throws ParseException{
		List<Compra> compras = this.getCompras();
		double total=0;
		for (int i=0;i<compras.size();i++){
			total += compras.get(i).MontoPagar_Cliente();
		}
		return total;
	}
	public List<Pago> getPagos(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Pago> pagos = conexion.findByProperty(Pago.class, Restrictions.eq("estatus", 'a'));
		List<Pago> pagos_cuenta = new ArrayList<Pago>();
		Pago pago;
		for (int i=0;i<pagos.size();i++){
			pago = pagos.get(i);
			if (pago.getCuenta().getId().equals(this.id)){
				pagos_cuenta.add(pago);
			}
		}
		return pagos_cuenta;
	}
	
	public List<Venta> getVentas(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Venta> ventas = conexion.findByProperty(Venta.class, Restrictions.eq("estatus", 'a'));
		List<Venta> ventas_cuenta = new ArrayList<Venta>();
		Venta venta;
		for (int i=0;i<ventas.size();i++){
			venta = ventas.get(i);
			if ((venta.getCliente().getCedula_rif().equals(this.cliente.getCedula_rif()))&&(venta.getFecha().getMonth()==this.getFecha().getMonth())){
				ventas_cuenta.add(venta);
			}
		}
		return ventas_cuenta;
	}
	
	public List<Compra> getCompras(){
		Base_DatosDAO conexion = new Base_DatosDAO();
		List<Compra> compras = conexion.findByProperty(Compra.class, Restrictions.eq("estatus", 'a'));
		List<Compra> compras_cuenta = new ArrayList<Compra>();
		Compra compra;
		for (int i=0;i<compras.size();i++){
			compra = compras.get(i);
			if (((estaCliente(this.cliente,compra))&&compra.getFecha().getMonth()==this.getFecha().getMonth())){
				compras_cuenta.add(compra);
			}
		}
		return compras_cuenta;
	}

	private boolean estaCliente(Cliente cliente,Compra compra) {
		for(int i=0;i<compra.getClientes_compra().size();i++){
			if(cliente.getCedula_rif().equals(compra.getClientes_compra().get(i).getCliente().getCedula_rif())){
				return true;
			}
		}
		return false;
	}
	
	
	
}
